; nasm -f bin _1.asm -o _1.bin
; qemu-img create _1.img 10m
; dd if=_1.bin of=_1.img bs=512 count=1 seek=0 conv=notrunc
; qemu-system-i386 -hda _1.img -serial null -parallel stdio

; qemu-system-i386 _1.bin
section .text
    global _start

_start:
    xor eax, eax ; eax = 0
    ; 初始化段寄存器, 段地址全部设为0
    mov ds, eax
    mov ss, eax
    mov es, eax
    mov fs, eax
    mov gs, eax

    ; 初始化栈指针
    mov esp, 0x7c00
    mov eax, 0xb800
    mov gs, ax

    mov ah, 2h ; 初始化光标的位置
    mov bh, 0x00
    mov dh, 0x0c
    mov dl, 0x0c
    int 0x10

    mov ah, 3h ; 获取光标位置
    int 0x10

    jmp input

output:
    ; mov ah, 9h ; 在光标位置输出字符
    ; mov al, '0' ; 字符为0
    ; mov bh, 0x00 ; 页号为0
    ; mov bl, 0x07 ; 字符颜色为白色
    ; mov cx, 0x01 ; 输出字符个数1
    ; int 0x10
    ; ret


    ; 在当前光标位置写字符和属性	AH=09H	AL=字符，BH=页码，BL=颜色，CX=多次打印字符
    mov ah, 10h
    int 16h
    mov ah, 0x01
    mov ah, 9h
    mov bh, 0x00
    mov bl, 0x07
    mov cx, 0x01
    int 0x10
    ret
input:
    ; 从键盘读取字符，缓冲区获取字符，读取ASCII码
    mov ah, 0h
    int 16h
    mov ah, 0x01 ; ah = 1, 从键盘读取字符
    cmp al, 'a'
    je left
    cmp al, 'd'
    je right
    cmp al, 'w'
    je up
    cmp al, 's'
    je down
    jmp input

left:
    mov ah,3h	;获取光标信息
    int 10h	
    dec dl		;进行光标坐标改变
    mov ah,2h	;设置新光标
    int 10h
    call output
    jmp input

right:
    mov ah,3h	;获取光标信息
    int 10h	
    inc dl		;进行光标坐标改变
    mov ah,2h	;设置新光标
    int 10h
    call output
    jmp input

up:
    mov ah,3h	;获取光标信息
    int 10h	
    dec dh		;进行光标坐标改变
    mov ah,2h	;设置新光标
    int 10h
    call output
    jmp input

down:
    mov ah,3h	;获取光标信息
    int 10h	
    inc dh		;进行光标坐标改变
    mov ah,2h	;设置新光标
    int 10h
    call output
    jmp input

jmp $ ; 死循环
times 510-($-$$) db 0
dw 0xaa55
